#include "Stack.h"

int StackEmpty(const Stack* ps) {
	assert(ps);
	if (!ps->_top) {
		return 0;
	}
	else {
		return 1;
	}
}

void StackInit(Stack* ps) {
	assert(ps);
	ps->_a = NULL;
	ps->_capacity = ps->_top = 0;
}

void StackDestory(Stack* ps) {
	assert(ps);
	free(ps->_a);
	ps->_a = NULL;
	ps->_capacity = ps->_top = 0;
}

void StackPush(Stack* ps, const STDataType data) {
	assert(ps);
	if (ps->_capacity <= ps->_top + 1) {
		int new_capacity = ps->_capacity == 0 ? 4 : 2 * ps->_capacity;
		STDataType* tmp = (STDataType*)realloc(ps->_a, new_capacity * sizeof(STDataType));
		if (!tmp) {
			perror("realloc fail:");
			exit(1);
		}
		ps->_a = tmp;
		ps->_capacity = new_capacity;
	}
	ps->_a[++ps->_top] = data;
}

void StackPop(Stack* ps) {
	if (!StackEmpty(ps)) {
		printf("Stack has no data!\n");
	}
	else {
		ps->_top--;
	}
}

STDataType StackTop(const Stack* ps) {
	if (!StackEmpty(ps)) {
		printf("Stack has no data!\n");
		return -1;
	}
	else {
		return ps->_a[ps->_top];
	}
}

int StackSize(const Stack* ps) {
	assert(ps);
	return ps->_top;
}

//bool isValid(char* s) {
//	Stack ps;
//	StackInit(&ps);
//	while (*s) {
//		if (*s == '(' || *s == '{' || *s == '[') {
//			StackPush(&ps, *s);
//		}
//		else {
//			if (*s == ')') {
//				if (StackTop(&ps) != '(')
//					return false;
//			}
//			else if (*s == '}') {
//				if (StackTop(&ps) != '{')
//					return false;
//			}
//			else if (*s == ']') {
//				if (StackTop(&ps) != '[')
//					return false;
//			}
//			StackPop(&ps);
//		}
//		s++;
//	}
//	if (!StackEmpty(&ps)) {
//		return true;
//	}
//	else {
//		return false;
//	}
//}